#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define low (x&(-x))
using namespace std;
const ll N=2005;
ll n,a[N],dp[N][N][2],mx,tree[4][N][N];
ll sum(ll x,ll px,ll py){ll res=0;while(x) res=max(res,tree[px][py][x]),x-=low;return res;}
update(ll x,ll d,ll px,ll py){while(x<N) tree[px][py][x]=max(tree[px][py][x],d),x+=low;}
signed main(){
	freopen("shung.in","r",stdin);
	freopen("shung.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){
			dp[i][j][0]=dp[i][j][1]=2;
			dp[i][j][0]=max(dp[i][j][0],sum(a[i],0,j)+1);
			dp[i][j][0]=max(dp[i][j][0],sum(a[i],3,j)+1);
			dp[i][j][1]=max(dp[i][j][1],sum(n,1,j)-sum(a[i],1,j)+1);
			dp[i][j][1]=max(dp[i][j][1],sum(n,2,j)-sum(a[i],2,j)+1);
			//for(int k=j+1;k<i;k++) if(a[k]<a[i]) dp[i][j][0]=max(dp[i][j][0],dp[k][j][0]+1);
			//for(int k=1;k<j;k++) if(a[k]<a[i]) dp[i][j][0]=max(dp[i][j][0],dp[j][k][1]+1);
			//for(int k=j+1;k<i;k++) if(a[k]>a[i]) dp[i][j][1]=max(dp[i][j][1],dp[k][j][1]+1);
			//for(int k=1;k<j;k++) if(a[k]>a[i]) dp[i][j][1]=max(dp[i][j][1],dp[j][k][0]+1);
			update(a[i],dp[i][j][0],0,j);
			update(a[i],dp[i][j][1],1,j);
			update(a[j],dp[i][j][0],2,i);
			update(a[j],dp[i][j][1],3,i);
			//cout<<i<<" "<<j<<" "<<dp[i][j][1]<<endl;
			mx=max(mx,max(dp[i][j][0],dp[i][j][1]));
		}
	}
	cout<<mx<<endl;
	return 0;
}

